package modelo;

public class ModeloJuego extends java.util.Observable {
	private Juego juego;
	public enum DisparoTipo { DISPARO_DIRECTO, MINA_CONTACTO, MINA_PUNTUAL, MINA_DOBLE, MINA_TRIPLE }
	public enum PosicionableTipo { MINA_CONTACTO, MINA_PUNTUAL, MINA_DOBLE, MINA_TRIPLE, BUQUE,
									DESTRUCTOR, LANCHA, PORTAAVIONES, ROMPEHIELOS }
	
	public ModeloJuego() { }	

	public int tamanioTablero() {		
		return Tablero.tamanio;
	}

	public void nuevoJuego(String nombreJugador) {
		this.juego = new Juego(nombreJugador);
		ActualizarObservadores();
	}

	public void pasarTurno() throws JuegoNoIniciadoException {
		if (this.juego == null)
			throw new JuegoNoIniciadoException();
		this.juego.jugar();
		ActualizarObservadores();		
	}
	
	public void ActualizarObservadores() {
		setChanged();
		notifyObservers();		
	}

	public int getPuntosTotalesJugador() {		
		return Jugador.PUNTOS_TOTALES;
	}

	public int getPuntosJugador() {		
		return juego.getJugador().getPuntos();
	}

	public void ponerDisparo(String tipoDeDisparo, String xy) {	
		DisparoTipo tipoDisparoEnum;
		
		try {
			tipoDisparoEnum = DisparoTipo.valueOf(tipoDeDisparo);
		} catch (IllegalArgumentException e) {
			return;
		}
		
		switch (tipoDisparoEnum){
			case DISPARO_DIRECTO:
				juego.getJugador().ponerDisparo(new DisparoDirecto(), 
						Character.getNumericValue(xy.charAt(1)), 
						Character.getNumericValue(xy.charAt(0)));
				break;
			
			case MINA_CONTACTO:
				juego.getJugador().ponerDisparo(new MinaContacto(Tablero.getInstancia().getCasillero(Character.getNumericValue(xy.charAt(1)), 
						Character.getNumericValue(xy.charAt(0)))));
				break;
			
			case MINA_PUNTUAL:
				juego.getJugador().ponerDisparo(new MinaPuntual(Tablero.getInstancia().getCasillero(Character.getNumericValue(xy.charAt(1)), 
						Character.getNumericValue(xy.charAt(0)))));
				break;
				
			case MINA_DOBLE:
				juego.getJugador().ponerDisparo(new MinaDoble(Tablero.getInstancia().getCasillero(Character.getNumericValue(xy.charAt(1)), 
						Character.getNumericValue(xy.charAt(0)))));
				break;
			
			case MINA_TRIPLE:
				juego.getJugador().ponerDisparo(new MinaTriple(Tablero.getInstancia().getCasillero(Character.getNumericValue(xy.charAt(1)), 
						Character.getNumericValue(xy.charAt(0)))));
				break;	
				
		}				
	}
	
	public Juego getJuego() {
		return this.juego;
	}

	public boolean finDelJuego() {			
		return this.juego.finDelJuego();
	}
	
	public void destruirJuego() {
		this.juego = null;
	}

}
